import axios from 'axios'
import WConfig from '@/config/index'
import WPopView from '../utils/popView'
import { getToken } from '@/utils/auth'
import { QueryString } from 'yb-tool'
import WLog from '../utils/YBLog/index'

/**
 * 创建axios实例
 * @type {AxiosInstance}
 */
const service = axios.create({
  timeout: 30000, // 请求超时时间
  // baseURL: '/yb-api'
})

/**
 * request拦截器
 */
service.interceptors.request.use(
  config => {
    if (WConfig.store.getters.token) {
      config.headers['Token'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    WConfig.print('================= url ==================')
    WConfig.print(config.method, '--->', config.url)
    WConfig.print('================= 参数 ==================')
    WConfig.print(config.method === 'post' ? config.data : config.params)
    // 所有请求都带上 authentication
    config.headers.Authentication = WConfig.store.getters.token
    // config.headers['Access-Control-Allow-Headers'] = 'Authentication'
    return config
  },
  error => {
    Promise.reject({
      netErr: error
    })
  }
)

/**
 * respone拦截器
 */
service.interceptors.response.use(
  response => {
    const res = response.data
    WConfig.print('================= response ==================', response.config.url)
    WConfig.print(res)
    if (res.code !== 0) {
      if (res.code === 13003 || res.code === 13002) {
        WPopView.msgError(`${res.msg},请重新登录`,{
          onClose() {
            WConfig.store.dispatch('FED_LOG_OUT')
            WConfig.router.push('/set/login')
          }
        })
      } else {
        WPopView.msgError(res.msg ? res.msg : '网络异常')
      }
      return Promise.reject({
        netErr: res
      })
    } else {
      return res.data
    }
  },
  error => {
    return Promise.reject({
      netErr: error
    })
  }
)

/**
 * ajax log中间处理
 * @param asyncFunc 一步函数
 * @param type 请求类型
 * @param params 参数
 * @returns {Promise<any>} 返回值
 */
function ajaxLog(asyncFunc, type, url, params) {
  const logData = {
    params: JSON.stringify(params),
    reqType: type,
    url: url
  }
  return new Promise((resolve, reject) => {
    asyncFunc.then((data) => {
      logData.success = '成功'
      WLog.addAjax(logData)
      resolve(data)
    }).catch((err) => {
      logData.success = '失败'
      logData.err = JSON.stringify(err)
      WLog.addAjax(logData)
      reject(err)
    })
  })
}

/**
 * 自定义封装git
 * @param url 请求URL
 * @param params 请求参数
 * @param cache 是否缓存
 * @returns {Promise}
 */
export function get(url, params = {}, cache) {
  const urlKEY = `${url}?${QueryString.stringify(params)}`
  const isCatch = (!WConfig.debug && cache)
  if (isCatch) {
    const catchData = sessionStorage.getItem(urlKEY)
    if (catchData) {
      return Promise.resolve(JSON.parse(catchData))
    }
  }
  const asyncFunc = new Promise((resolve, reject) => {
    service.get(url, {
      // 请求参数
      params
    }).then((data) => {
      if (isCatch) {
        sessionStorage.setItem(urlKEY, JSON.stringify(data))
      }
      resolve(data)
    }).catch((err) => {
      reject(err)
    })
  })
  return ajaxLog(asyncFunc, 'get', url, params)
}

/**
 * 自定义封装delete
 * @param url 请求URL
 * @param params 请求参数
 * @returns {Promise}
 */
export function deleteAjax(url, params = {}) {
  const asyncFunc = service.delete(url, {
    // 请求参数
    params
  })
  return ajaxLog(asyncFunc, 'delete', url, params)
}

/**
 * 自定义封装POST
 * @param url 请求URL
 * @param params 请求参数
 * @returns {Promise}
 */
export function post(url, params = {}) {
  const asyncFunc = service.post(url, params)
  return ajaxLog(asyncFunc, 'post', url, params)
}

/**
 * 图片上传
 * @param url 请求URL
 * @param name 文件名传输属性名
 * @param e 事件对象
 * @returns {Promise}
 */
export function upImage(url, name, e) {
  const file = e.target.files[0]
  // 判断图片大小，超出后直接返回
  const fileSize = file.size
  if (fileSize > (2 * 1024 * 1024)) {
    return Promise.reject({
      code: 1,
      msg: '图片大小不能超所2M'
    })
  }
  // 创建form对象
  const params = new FormData()
  // 通过append向form对象添加数据
  params.append(name, file, file.name)
  return service.post(url, params, {
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  })
}

/**
 * 上传文件
 * @param url 请求URL
 * @param params 请求参数
 * @returns {Promise}
 */
export function upFile(url, params) {
  return service.post(url, params, {
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  })
}
